#include <stdio.h>
#include <stdbool.h>

#define SQ(x) ((x)*(x))

int happy(int n) {
    int sum = 0;
    int factor = 0;
    while (n) {
        factor = n % 10;
        n /= 10;
        sum += SQ(factor);
        //printf("debug2 %d, %d %d \n", n, sum, factor);
    }
    return sum;
}

bool is_exist(int n, int *hash, int size) {
    for (int i = 0; i < size; i++)
        if (n == hash[i])
            return true;
    return false;
}

bool isHappy(int n) {
    int hash[1000] = {-1};
    int idx = 0;
    while (1) {
        int num = happy(n);
        if (num == 1)
            return true;
        hash[idx++] = num;
        n = num;
        if (idx == 1000) return false;
    }
    return false;
}

int main(void)
{
    printf("#242. 有效的字母异位词\n");

    printf("\n这道题是简单题，但是还是很有必要拿出来说说：\n");
    printf("\n首先看到它时，知道是哈希题，想着用c语言做不了，用python的dict做。其实错了\n");
    printf("\n 这个题目里，hash用来用作退出条件（但是没有hash，还是笨办法找的）：\n\
    如果计算中出现了重复计算的数，则说明无限循环了，永远不可能成为快乐数。。\n\
    我们就假定最多算1000次就能判断出是否有循环，则定一个1000大小的数组。如果1000不够，就10000");

    printf("\n\nans: %s\n", isHappy(19) ? "true" : "false");
    return 0;
}